package ar.com.jsejtman.common.security.credential.service;

import ar.com.jsejtman.common.mail.exception.CannotSendEmailException;
import ar.com.jsejtman.common.security.credential.exception.InvalidUsernameException;
import ar.com.jsejtman.common.security.credential.exception.UsernameNotMatchingEmailAddressException;
import ar.com.jsejtman.common.service.exception.EntityRetrievalException;
import ar.com.jsejtman.common.service.exception.EntitySavingException;
import org.springframework.security.core.userdetails.UserDetails;

/**
 * Servicio para obtener credenciales de seguridad.
 * 
 * @author jsejtman
 */
public interface ISecurityCredentialService {

	/**
	 * Obtiene una credencial de seguridad para un usuario de seguridad.
	 * 
	 * @param username Nombre de usuario de seguridad.
	 * @return Credencial de seguridad.
	 */
	UserDetails loadUserByUsername(String username);

	/**
	 * Reinicia la clave de seguridad de un usuario. Para ello, primero verifica que el usuario y
	 * dirección de Email coincidan con la del usuario en la base, y luego remite por dicho medio
	 * una nueva clave generada automáticamente al azar.
	 * 
	 * @param username Nombre de usuario de seguridad.
	 * @param emailAddress Dirección de Email a verificar.
	 * @throws InvalidUsernameException En caso de que el usuario de seguridad sea inválido.
	 * @throws UsernameNotMatchingEmailAddressException En caso de que no coincidan las direcciones
	 *             de Email.
	 * @throws EntityRetrievalException En caso de problemas al obtener la credencial de seguridad.
	 * @throws EntitySavingException En caso de problemas al grabar la nueva clave.
	 * @throws CannotSendEmailException En caso de no poder enviar el Email con la nueva clave.
	 */
	void resetUserPassword(final String username, final String emailAddress)
	        throws InvalidUsernameException, UsernameNotMatchingEmailAddressException,
	        EntitySavingException, EntityRetrievalException, CannotSendEmailException;
}
